<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>计网课程复习 | 后端学习记录</title><meta name="keywords" content="计网"><meta name="author" content="h0ss"><meta name="copyright" content="h0ss"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="1. ARP协议1）概述地址解析协议，即Address Resolution Protocol，是根据IP地址获取物理地址的一个TCP&#x2F;IP协议 2）作用在以太网环境中，数据的传输所依懒的是MAC地址而非IP地址，而ARP协议就是用于将已知IP地址转换为MAC地址，它的基本功能就是通过目标设备的IP地址，查询目标设备的MAC地址，以保证通信的顺利进行。 3）映射方式3.1）：静态映射通过手动创建A">
<meta property="og:type" content="article">
<meta property="og:title" content="计网课程复习">
<meta property="og:url" content="https://blog.gpnusz.cn/2021/02/02/%E8%AE%A1%E7%BD%91%E8%AF%BE%E7%A8%8B%E5%A4%8D%E4%B9%A0/index.html">
<meta property="og:site_name" content="后端学习记录">
<meta property="og:description" content="1. ARP协议1）概述地址解析协议，即Address Resolution Protocol，是根据IP地址获取物理地址的一个TCP&#x2F;IP协议 2）作用在以太网环境中，数据的传输所依懒的是MAC地址而非IP地址，而ARP协议就是用于将已知IP地址转换为MAC地址，它的基本功能就是通过目标设备的IP地址，查询目标设备的MAC地址，以保证通信的顺利进行。 3）映射方式3.1）：静态映射通过手动创建A">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://i.loli.net/2021/09/01/PvqRnTrUBh1a37J.jpg">
<meta property="article:published_time" content="2021-02-02T11:22:16.000Z">
<meta property="article:modified_time" content="2022-07-28T07:11:30.575Z">
<meta property="article:author" content="h0ss">
<meta property="article:tag" content="计网">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://i.loli.net/2021/09/01/PvqRnTrUBh1a37J.jpg"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://blog.gpnusz.cn/2021/02/02/%E8%AE%A1%E7%BD%91%E8%AF%BE%E7%A8%8B%E5%A4%8D%E4%B9%A0/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = { 
  root: '/',
  algolia: undefined,
  localSearch: undefined,
  translate: undefined,
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '天',
  date_suffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: undefined,
  lightbox: 'fancybox',
  Snackbar: undefined,
  source: {
    jQuery: 'https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js',
    justifiedGallery: {
      js: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/js/jquery.justifiedGallery.min.js',
      css: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/css/justifiedGallery.min.css'
    },
    fancybox: {
      js: 'https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.js',
      css: 'https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.css'
    }
  },
  isPhotoFigcaption: false,
  islazyload: false,
  isanchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = { 
  isPost: true,
  isHome: false,
  isHighlightShrink: false,
  isToc: false,
  postUpdate: '2022-07-28 15:11:30'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(win=>{
    win.saveToLocal = {
      set: function setWithExpiry(key, value, ttl) {
        if (ttl === 0) return
        const now = new Date()
        const expiryDay = ttl * 86400000
        const item = {
          value: value,
          expiry: now.getTime() + expiryDay,
        }
        localStorage.setItem(key, JSON.stringify(item))
      },

      get: function getWithExpiry(key) {
        const itemStr = localStorage.getItem(key)

        if (!itemStr) {
          return undefined
        }
        const item = JSON.parse(itemStr)
        const now = new Date()

        if (now.getTime() > item.expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return item.value
      }
    }
  
    win.getScript = url => new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = url
      script.async = true
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    })
  
      win.activateDarkMode = function () {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = function () {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
          if (t === 'dark') activateDarkMode()
          else if (t === 'light') activateLightMode()
        
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    })(window)</script><meta name="generator" content="Hexo 5.4.0"><link rel="stylesheet" href="/css/prism-tomorrow.css" type="text/css"></head><body><div id="web_bg"></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="author-avatar"><img class="avatar-img" src="/img/avatar.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data"><div class="data-item is-center"><div class="data-item-link"><a href="/archives/"><div class="headline">文章</div><div class="length-num">51</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/tags/"><div class="headline">标签</div><div class="length-num">14</div></a></div></div></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div></div><div class="post" id="body-wrap"><header class="not-top-img" id="page-header"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">后端学习记录</a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav></header><main class="layout" id="content-inner"><div id="post"><div id="post-info"><h1 class="post-title">计网课程复习</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2021-02-02T11:22:16.000Z" title="发表于 2021-02-02 19:22:16">2021-02-02</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2022-07-28T07:11:30.575Z" title="更新于 2022-07-28 15:11:30">2022-07-28</time></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-wordcount"><i class="far fa-file-word fa-fw post-meta-icon"></i><span class="post-meta-label">字数总计:</span><span class="word-count">7.3k</span><span class="post-meta-separator">|</span><i class="far fa-clock fa-fw post-meta-icon"></i><span class="post-meta-label">阅读时长:</span><span>22分钟</span></span></div></div></div><article class="post-content" id="article-container"><h2 id="1-ARP协议"><a href="#1-ARP协议" class="headerlink" title="1. ARP协议"></a>1. ARP协议</h2><h3 id="1）概述"><a href="#1）概述" class="headerlink" title="1）概述"></a>1）概述</h3><p>地址解析协议，即Address Resolution Protocol，是根据IP地址获取物理地址的一个<strong>TCP/IP协议</strong></p>
<h3 id="2）作用"><a href="#2）作用" class="headerlink" title="2）作用"></a>2）作用</h3><p>在以太网环境中，数据的传输所依懒的是MAC地址而非IP地址，而ARP协议就是用于<strong>将已知IP地址转换为MAC地址</strong>，它的基本功能就是通过目标设备的IP地址，查询目标设备的MAC地址，以保证通信的顺利进行。</p>
<h3 id="3）映射方式"><a href="#3）映射方式" class="headerlink" title="3）映射方式"></a>3）映射方式</h3><h4 id="3-1）：静态映射"><a href="#3-1）：静态映射" class="headerlink" title="3.1）：静态映射"></a>3.1）：静态映射</h4><p>通过<strong>手动创建</strong>ARP表的方式将IP和MAC地址关联起来，并将该表存储在每一台机器上。这种方法有较大的局限性，当机器的网络适配器（网卡）更换时，MAC地址就会变更，这时原来的ARP表就失效了，使用这种方式需要定期维护更新ARP表。</p>
<h4 id="3-2）：动态映射"><a href="#3-2）：动态映射" class="headerlink" title="3.2）：动态映射"></a>3.2）：动态映射</h4><p>每次只要机器知道另一台机器的IP地址，就可以使用协议找出相对应的物理地址。已经设计出的实现了动态映射协议的有ARP和RARP两种。ARP把IP地址映射为物理地址。RARP（反向地址转换协议）把物理地址映射为IP地址。</p>
<p>现在使用的都是这种方式。</p>
<h3 id="4）工作流程"><a href="#4）工作流程" class="headerlink" title="4）工作流程"></a>4）工作流程</h3><p>当PC1向PC2发送数据报文时，PC1会先在<strong>网络层</strong>向<strong>广播地址</strong>发送一个ARP包（包含需要获取MAC地址的IP），处于同一网络层的设备将会收到该数据包，之后机器会将包里的IP与自身进行对比，若对应则返回一个ARP响应包（包含自身的MAC地址），以单播的形式返回给请求的机器（点对点），若不匹配则会将ARP包丢弃。</p>
<h3 id="5）报文解析"><a href="#5）报文解析" class="headerlink" title="5）报文解析"></a>5）报文解析</h3><p>ARP报文的总长度为64字节。其中包含以太网v2的帧头，长度为14 bytes以及ARP数据包，长度为28 bytes。真正发包时为了保证以太网帧的最小帧长为64 bytes，会在报文里添加一个padding字段，用来填充数据包大小。</p>
<p>在PC1向PC2发送ARP请求的场景中：①以太网V2帧头的信息主要为<strong>目的MAC地址</strong>（FF:FF:FF:FF:FF:FF）以及<strong>源MAC地址</strong>（PC1的地址）。②ARP包的信息主要为：源IP（PC1的IP）、源MAC地址（PC1的MAC地址）、目标MAC地址(00:00:00:00:00:00)、目标IP（PC2的IP）、Type帧类型（ARP）、Hardware Type硬件类型（Ethernet）、Protocol Type协议类型（IP）、Hardware Size硬件长度（6）、Protocol Size协议长度（4）。</p>
<p>如果PC2对比匹配成功，将会返回一个ARP回复包给到PC1，这时目的地址源地址就都是确定的了。</p>
<h3 id="6）注释"><a href="#6）注释" class="headerlink" title="6）注释"></a>6）注释</h3><p>6.1）在终端中使用arp -a可以查看当前机器的ARP表情况，arp -d xx可以删除对应的ARP表项，ARP表项的老化超时时间缺省为1200秒（20min）；</p>
<p>6.2）ARP包只会在同一广播域进行广播，不会跨网段发送；</p>
<p>6.3）在wireshark中抓ARP包，只会看到60byte的包，因为处于数据包尾端的CRC字段（4byte）不会被获取到；</p>
<h2 id="2-PPP协议"><a href="#2-PPP协议" class="headerlink" title="2. PPP协议"></a>2. PPP协议</h2><h3 id="1）概述-1"><a href="#1）概述-1" class="headerlink" title="1）概述"></a>1）概述</h3><p>PPP即点到点协议（Point-to-Point Protocol），是一种最常见的<strong>广域网数据链路层协议</strong>，主要用于在全双工的链路上进行点到点的数据传输封装。</p>
<h3 id="2）PPP链路"><a href="#2）PPP链路" class="headerlink" title="2）PPP链路"></a>2）PPP链路</h3><p>PPP链路的建立有三个阶段的协商过程：链路层协商、认证协商（可选）和网络层协商。首先采用PPP协议的链路会先将数据封装成帧，之后通过LCP报文进行链路参数协商，建立链路层连接；如果设置了认证协商，将会进行链路认证，否则会直接通过NCP协商来选择和配置一个网络层协议并进行网络层参数协商。</p>
<h3 id="3）报文解析"><a href="#3）报文解析" class="headerlink" title="3）报文解析"></a>3）报文解析</h3><p>PPP帧格式主要字段解析：<br>Address字段——广播地址 0XFF<br>Control字段——表明为无序号帧 0X03<br>Protocol字段——说明PPP所封装的协议报文类型，<strong>0XC021代表LCP报文，0XC023代表PAP报文，0XC223代表CHAP报文</strong><br>如果协议字段为0XC021则Information字段内容为LCP协商过程的各种参数。此外常用的PPP认证协议有PAP和CHAP，一条PPP链路的两端可以使用不同的认证协议认证对端，但是被认证方必须支持认证方要求使用的认证协议并正确配置用户名和密码等认证信息。</p>
<h3 id="4）LCP协商"><a href="#4）LCP协商" class="headerlink" title="4）LCP协商"></a>4）LCP协商</h3><p>场景：R1跟R2之间进行协商</p>
<p>LCP协商过程主要有三种情况：</p>
<p>①成功协商：R1发送<strong>Configure-Request</strong>报文，其中包含R1的链路层参数，R2收到之后如果识别接受则回复<strong>Configure-Ack</strong>报文，并发送Configure-Request报文，其中包含R2的链路层参数，R1回复ack报文之后则代表协商成功。<em>其实这里的链路层参数主要是Information字段的内容。</em></p>
<p>②R1向R2发送Request报文，但是LCP参数不匹配，R2将发送一个<strong>Configure-Nak</strong>包告知R1修改参数重新协商，Nak包中只包含不能接受的链路层参数，并且此报文所包含的链路层参数将被修改为R2上可以接受的取值。在收到Nak报文之后，R1需要根据此报文中的链路层参数重新选择本地配置的其他参数，并重新发送一个Configure-Request。</p>
<p>③R1向R2发送Request报文，但是LCP参数不识别，R2将发送<strong>Configure-Reject</strong>包告知R1删除不识别的参数然后重新协商。在Reject报文中，只包含不能被识别的链路层参数。R1收到Reject包后需要向R2重新发送一个Request报文，在新的Request报文中，不再包含不被R2识别的参数。</p>
<p>如果R1没有收到ack报文，那么将每隔3s重发一个request报文，如果连续十次没有ack报文，则认为对端不可用，停止发送。这一过程从实训任务的PPP协议配置那一节中也可以看出：在进行PAP认证之前，会先有两个request包以及ack包，之后再开始pap认证包的发送。</p>
<p><strong>总结：协商成功是2个Request和2个Ack，LCP参数不匹配是Request和Nak包，LCP参数不识别是Request和Reject包</strong></p>
<h3 id="5）PAP认证-CHAP认证"><a href="#5）PAP认证-CHAP认证" class="headerlink" title="5）PAP认证 CHAP认证"></a>5）PAP认证 CHAP认证</h3><h4 id="5-1）PAP认证：两次握手协议，密码明文传输"><a href="#5-1）PAP认证：两次握手协议，密码明文传输" class="headerlink" title="5.1）PAP认证：两次握手协议，密码明文传输"></a>5.1）PAP认证：两次握手协议，密码明文传输</h4><p>①被认证方将配置的用户名和密码信息使用Authenticate-Request报文以明文方式发送给认证方；</p>
<p>②认证方收到被认证方发送的用户名和密码信息之后，根据本地配置的用户名和密码数据库检查用户名和密码信息是否匹配；如果匹配，则返回Authenticate-Ack报文，表示认证成功。否则，返回Authenticate-Nak报文，表示认证失败。</p>
<p>这里需要注意的是，<strong>两端的用户数据库中都需要有对应的认证用户，才可以识别成功</strong>。实训任务中PAP认证失败的原因之一就是一方没有在aaa中/接口中配置用户，而导致认证失败。</p>
<h4 id="5-2）CHAP认证：三次报文交互，密码密文传输"><a href="#5-2）CHAP认证：三次报文交互，密码密文传输" class="headerlink" title="5.2）CHAP认证：三次报文交互，密码密文传输"></a>5.2）CHAP认证：三次报文交互，密码密文传输</h4><p>①认证方向被认证方发送Challenge报文，报文内包含随机数和ID；</p>
<p>②被认证方收到此Challenge报文之后，进行一次加密运算，即将｛ID＋随机数＋密码｝连成一个字符串，然后对此字符串做MD5运算，得到一个16 Byte长的摘要信息，然后将此摘要信息和端口上配置的CHAP用户名一起封装在Response报文中发回认证方；</p>
<p>③认证方收到被认证方发送的Response报文之后，按照其中的用户名在本地查找相应的密码信息，得到密码信息之后，进行一次加密运算，将加密运算得到的摘要信息和Response报文中封装的摘要信息做比较，相同则认证成功，不相同则认证失败。</p>
<p><strong>总结：由于CHAP认证中密码是经过加密之后传输的，所以安全性较PAP要高。</strong></p>
<h3 id="6）地址协商"><a href="#6）地址协商" class="headerlink" title="6）地址协商"></a>6）地址协商</h3><h4 id="6-1）静态IP地址协商"><a href="#6-1）静态IP地址协商" class="headerlink" title="6.1）静态IP地址协商"></a>6.1）静态IP地址协商</h4><p>每一端都要发送Configure-Request报文，在此报文中包含本地配置的IP地址；每一端接收到此Configure-Request报文之后，检查其中的IP地址，如果IP地址是一个合法的单播IP地址，而且和本地配置的IP地址不同（没有IP冲突），则认为对端可以使用该地址，回应一个Configure-Ack报文。<strong>在这种协商方式下需要在链路两端配置IP地址。</strong></p>
<h4 id="6-2）动态IP地址协商"><a href="#6-2）动态IP地址协商" class="headerlink" title="6.2）动态IP地址协商"></a>6.2）动态IP地址协商</h4><p>①认证方向被认证方发送一个Configure-Request报文，此报文中会包含一个IP地址0.0.0.0，表示向对端请求IP地址；</p>
<p>②认证方收到上述Configure-Request报文后，认为其中包含的地址（0.0.0.0）不合法，使用Configure-Nak回应一个新的IP地址10.1.1.1（即接口配置的remote xxx）；</p>
<p>③认证方收到此Configure-Nak报文之后，更新本地IP地址，并重新发送一个Configure-Request报文，包含新的IP地址10.1.1.1；</p>
<p>④被认证方收到Configure-Request报文后，认为其中包含的IP地址为合法地址，回应一个Configure-Ack报文；</p>
<p>⑤被认证方向认证方发送Configure-Request报文请求使用地址10.1.1.2，认证方认为此地址合法，回应Configure-Ack报文。</p>
<p>也就是说这个过程中除了正常的协商确认地址，还需要进行地址获取，这也就是在接口中配置remote xxx的意义。</p>
<p><strong>总结：在静态地址协商中需要在两端配置IP地址，而在动态地址协商中只需要在一方配置IP地址并配置remote（给对端分配的IP地址）即可实现地址协商。</strong></p>
<h2 id="3-计算机网络中的时延"><a href="#3-计算机网络中的时延" class="headerlink" title="3. 计算机网络中的时延"></a>3. 计算机网络中的时延</h2><h4 id="1）概念"><a href="#1）概念" class="headerlink" title="1）概念"></a>1）概念</h4><p>时延是指数据（一个报文或分组，甚至比特）从网络（或链路）的一端传送到另一端所需的时间。有时也称为延迟或迟延。网络中的时延包括发送时延、传播时延、处理时延、排队时延。<em><strong>总时延 = 发送时延 + 传播时延 + 处理时延 + 排队时延。</strong></em></p>
<h4 id="2）发送时延"><a href="#2）发送时延" class="headerlink" title="2）发送时延"></a>2）发送时延</h4><p>发送时延是主机或路由器发送数据帧所需要的时间， 也就是从发送数据帧的第一个比特算起，到该帧的最后一个比特发送完毕所需要的时间。发送时延的计算公式为：<strong>发送时延 = 数据帧长度（bit）/ 发送速率（bit/s）</strong></p>
<p>例：一个长度为10MB的数据块，在带宽为1Mbit/s的信道上持续发送，求发送时延。<br>首先，10MB的数据块：10 MB = 10x2^20x8 bit<br>接着按照公式进行计算即可：(10x2^20x8)/10^6 ≈ 83s</p>
<h4 id="3）传播时延"><a href="#3）传播时延" class="headerlink" title="3）传播时延"></a>3）传播时延</h4><p>电磁波在信道中需要传播一定的距离而花费的时间，因此便产生了传播时延。需要注意的是，发送时延和传播时延是两个东西。传播时延计算公式为：<strong>传播时延 = 信道长度（m）/ 电磁波在信道上的传播速率（m/s）</strong>。</p>
<h4 id="4）处理时延"><a href="#4）处理时延" class="headerlink" title="4）处理时延"></a>4）处理时延</h4><p>主机或路由器在收到分组时，为处理分组（例如分析首部、提取数据、差错检验或查找路由）所花费的时间。 </p>
<h4 id="5）排队时延"><a href="#5）排队时延" class="headerlink" title="5）排队时延"></a>5）排队时延</h4><p>分组在路由器输入输出队列中排队等待处理所经历的时延。排队时延的长短往往取决于网络中当时的通信量。</p>
<h2 id="4-ABC类网络地址及计算"><a href="#4-ABC类网络地址及计算" class="headerlink" title="4. ABC类网络地址及计算"></a>4. ABC类网络地址及计算</h2><h4 id="1）概述-2"><a href="#1）概述-2" class="headerlink" title="1）概述"></a>1）概述</h4><p><strong>每一类地址都为4字节32个二进制位</strong>，由两个固定长度的字段组成，其中一个字段是<strong>网络号</strong>，它标志主机（或路由器）所连接到的网络，而另一个字段则是<strong>主机号</strong>，它标志该主机（或路由器）。主机号在它前面的网络号所指明的网络范围内必须是唯一的。<strong>也就是说网络号指明的是网段，而主机号指明的是具体的机器。</strong></p>
<h4 id="2）A类地址"><a href="#2）A类地址" class="headerlink" title="2）A类地址"></a>2）A类地址</h4><p>①A类地址第1字节为网络地址（最高位固定是0），另外3个字节为主机地址。<br>②A类地址范围：1.0.0.0 - 126.255.255.255，其中0和127作为特殊地址。因此A类地址中网络号可用的有2^7-2个地址，也就是说可以有这么多个网段。<br>③A类网络默认子网掩码为255.0.0.0，也可写作/8。<br>④A类网络一个网段中最大主机数量是256×256×256-2=166777214（减去1个主机位为0的网络地址和1个广播地址）。</p>
<h4 id="3）B类地址"><a href="#3）B类地址" class="headerlink" title="3）B类地址"></a>3）B类地址</h4><p>①B类地址第1字节（最高位固定是10）和第2字节为网络地址，另外2个字节为主机地址。<br>②B类地址范围：128.1.0.0 - 191.255.255.255。其中私用IP地址为172.16.0.0到172.31.255.255。因此B类地址中网络号可用的有2^14-1个地址，也就是说可以有这么多个网段。<br>③B类网络默认子网掩码为255.255.0.0，也可写作/16。<br>④B类网络一个网段中最大主机数量256×256-2=6554。</p>
<h4 id="4）C类地址"><a href="#4）C类地址" class="headerlink" title="4）C类地址"></a>4）C类地址</h4><p>①C类地址第1字节（最高位固定是110）、第2字节和第3个字节为网络地址，另外1个字节为主机地址。<br>②C类地址范围：192.0.1.0 - 223.255.255.255。其中私用IP地址为192.168.0.0到192.168.255.255。因此C类地址中网络号可用的有2^21-1个地址，也就是说可以有这么多个网段。<br>③C类网络默认子网掩码为255.255.255.0，也可写作/24。<br>④C类网络一个网段中最大主机数量256-2=254。</p>
<p>如果考试中给出一个IP地址，让判断属于哪一类网络，只要对比第一个字节即可，注意要绕开特殊地址。</p>
<h2 id="5-计算机网络的体系结构，每一层PDU，每一层的作用"><a href="#5-计算机网络的体系结构，每一层PDU，每一层的作用" class="headerlink" title="5. 计算机网络的体系结构，每一层PDU，每一层的作用"></a>5. 计算机网络的体系结构，每一层PDU，每一层的作用</h2><h4 id="1）OSI体系结构"><a href="#1）OSI体系结构" class="headerlink" title="1）OSI体系结构"></a>1）OSI体系结构</h4><p>从上往下依次为：应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。</p>
<h4 id="2）TCP-IP体系结构"><a href="#2）TCP-IP体系结构" class="headerlink" title="2）TCP/IP体系结构"></a>2）TCP/IP体系结构</h4><p>从上往下依次为：应用层、传输层、网际层、网络接口层。</p>
<h4 id="3）五层协议体系结构"><a href="#3）五层协议体系结构" class="headerlink" title="3）五层协议体系结构"></a>3）五层协议体系结构</h4><p>OSI 的七层协议体系结构的概念清楚，理论也较完整，但它既复杂又不实用，TCP/IP 是四层体系结构，最下面的网络接口层并没有具体内容。因此往往采取折中的办法，即综合 OSI 和 TCP/IP 的优点，采用一种只有五层协议的体系结构 </p>
<p>从上往下依次为：</p>
<p><strong>应用层</strong>：应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信和交互的规则。</p>
<p><strong>传输层</strong>：运输层的任务就是负责向两台主机中的进程之间的通信提供通用的数据传输服务。主要有TCP和UDP协议。</p>
<p><strong>网络层</strong>：网络层负责为分组交换网上的不同主机提供通信服务。</p>
<p><strong>数据链路层</strong>：在两个相邻结点之间传送数据时，数据链路层将网络层交下来的IP数据报封装成帧(frameing),在两个相邻节点间的链路上传送帧, 每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错信息等)。</p>
<p><strong>物理层：</strong>在物理层上所传数据的单位是比特(bit)，物理层要考虑用多大的电压代表”1”或者”0”, 以及接收方如何识别发送方所发出的比特。</p>
<h4 id="4）PDU"><a href="#4）PDU" class="headerlink" title="4）PDU"></a>4）PDU</h4><p><strong>PDU指的是协议数据单元</strong>，OSI 参考模型把对等层次之间传送的数据单位称为该层的协议数据单元 PDU。<strong>物理层的PDU为比特，数据链路层的PDU为帧，网络层的PDU为数据包（分组），传输层的PDU为报文，应用层的PDU为报文。</strong></p>
<h2 id="6-子网划分"><a href="#6-子网划分" class="headerlink" title="6. 子网划分"></a>6. 子网划分</h2><p>子网划分过程主要分为三步，第一步分析原网段，第二步向主机借位，第三步计算子网地址。</p>
<h4 id="1）分析原网段"><a href="#1）分析原网段" class="headerlink" title="1）分析原网段"></a>1）分析原网段</h4><p>需要根据给出的需要划分的网段地址以及子网掩码去进行分析。</p>
<p>例如：给出需要划分的网段IP为172.16.0.0/16，那么可以知道的是，这个网段是172.16.0.0，前16位为网络号，后16位为主机号。</p>
<h4 id="2）向主机借位"><a href="#2）向主机借位" class="headerlink" title="2）向主机借位"></a>2）向主机借位</h4><p>在得出大网段地址以及网络号、主机号所在位置之后即可以进行子网划分。</p>
<p>假如这个网段需要划分成4个子网，那么很显然需要2个二进制位（因为取值有0/1，2个二进制位排列组合有四种），那么就需要向主机号借位，变成前18位为网络号，后14位为主机号，此时子网掩码就变成18位了。</p>
<h4 id="3）计算子网地址"><a href="#3）计算子网地址" class="headerlink" title="3）计算子网地址"></a>3）计算子网地址</h4><p>划分之后的网络号和主机号都确定了，就可以进行子网地址的计算了。</p>
<p>第一个子网：172.16.0.0~172.16.63.255 （子网掩码18）</p>
<p>第二个子网：172.16.64.0~172.16.127.255 （子网掩码18）</p>
<p>第三个子网：172.16.128.0~172.16.191.255 （子网掩码18）</p>
<p>第四个子网：172.16.192.0~172.16.255.255 （子网掩码18）</p>
<h2 id="7-CSMA-CD协议"><a href="#7-CSMA-CD协议" class="headerlink" title="7. CSMA/CD协议"></a>7. CSMA/CD协议</h2><h4 id="1）CSMA-CD概述"><a href="#1）CSMA-CD概述" class="headerlink" title="1）CSMA/CD概述"></a>1）CSMA/CD概述</h4><p>CSMA/CD指的是<strong>载波监听多点接入 / 碰撞检测</strong> 。“多点接入”表示许多计算机以多点接入的方式连接在一根总线上。“载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据，如果有，则暂时不要发送数据，以免发生碰撞。 </p>
<h4 id="2）CSMA-CD工作原理"><a href="#2）CSMA-CD工作原理" class="headerlink" title="2）CSMA/CD工作原理"></a>2）CSMA/CD工作原理</h4><p>①准备发送：适配器从网络层获得一个分组，加上以太网的首部和尾部，组成以太网帧，，放入网卡的缓存中，但在发送之前，必须先检测信道。<br>②检测信道：不停地检测信道，一直等待信道空闲，并在96比特时间内信道保持空闲（保证了帧间最小时间间隔），就发送这个帧。<br>③在发送过程中仍不停地检测信道，即网络适配器要边发送边监听。这里只有两种可能性：a.在争用期内一直未检测到碰撞，这个帧发送成功。b.在争用期内检测到碰撞，这时立即停止发送数据，并按规定发送认为干扰信号。适配器接着就执行<strong>指数退避算法</strong>，等待r倍512比特时间后，返回到步骤②，继续检测信道。若重传16次仍不能成功，则停止重传向上报错。</p>
<h4 id="3）争用期-截断二进制指数退避算法"><a href="#3）争用期-截断二进制指数退避算法" class="headerlink" title="3）争用期  截断二进制指数退避算法"></a>3）争用期  截断二进制指数退避算法</h4><p>①以太网端到端的往返时间2t称为争用期（碰撞窗口）<br>②以太网使用截断二进制指数退避算法来确定碰撞后重传的时机。这种算法让发生碰撞的站在停止发送数据后，不是等待信道变为空闲后立即再发送数据，而是退避一个随机的时间。</p>
<h2 id="8-交换机"><a href="#8-交换机" class="headerlink" title="8. 交换机"></a>8. 交换机</h2><h4 id="1）交换机工作原理"><a href="#1）交换机工作原理" class="headerlink" title="1）交换机工作原理"></a>1）交换机工作原理</h4><p> 当交换机收到数据时，它会检查它的目的MAC地址，然后把数据从目的主机所在的接口转发出去。交换机之所以能实现这一功能，是因为交换机内部有一个MAC地址表，MAC地址表记录了网络中所有MAC地址与该交换机各端口的对应信息。某一数据帧需要转发时，交换机根据该数据帧的目的MAC地址来查找MAC地址表，从而得到该地址对应的端口，即知道具有该MAC地址的设备是连接在交换机的哪个端口上，然后交换机把数据帧从该端口转发出去。</p>
<p>1.交换机根据收到数据帧中的源MAC地址建立<strong>该地址同交换机端口的映射</strong>，并将其写入MAC地址表中。<br>2.交换机将数据帧中的目的MAC地址同已建立的MAC地址表进行比较，以决定由哪个端口进行转发。<br>3.如数据帧中的目的MAC地址不在MAC地址表中，则<strong>向所有端口转发</strong>。这一过程称为<strong>泛洪（flood）</strong>。<br>4.广播帧和组播帧向所有的端口转发</p>
<h4 id="2）MAC表的构建"><a href="#2）MAC表的构建" class="headerlink" title="2）MAC表的构建"></a>2）MAC表的构建</h4><p>为快速转发报文，以太网交换机需要建立和维护MAC地址表。<strong>交换机采用源MAC地址学习的方法建立MAC地址表</strong>。为了保证MAC地址表中的信息能够实时地反映网络情况，每个学习到的记录都有一个老化时间，如果在老化时间内收到地址信息则刷新记录。对没有收到相应的地址信息的则删除该记录。例如，计算机PC1停止了和交换机通信，达到老化时间后，交换机会将其对应的记录从MAC地址表中删除。</p>
<h4 id="3）交换机的三个功能"><a href="#3）交换机的三个功能" class="headerlink" title="3）交换机的三个功能"></a>3）交换机的三个功能</h4><p><strong>学习</strong>：以太网交换机了解每一端口相连设备的MAC地址，并将地址同相应的端口映射起来存放在交换机缓存中的MAC地址表中.</p>
<p><strong>转发/过滤</strong>：当一个数据帧的目的地址在MAC地址表中有映射时，它被转发到连接目的节点的端口而不是所有端口（如该数据帧为广播/组播帧则转发至所有端口)</p>
<p><strong>消除回路</strong>：当交换机包括一个冗余回路时，以太网交换机通过生成树协议避免回路的产生，同时允许存在后备路径。</p>
<h4 id="4）交换机分类"><a href="#4）交换机分类" class="headerlink" title="4）交换机分类"></a>4）交换机分类</h4><p><strong>存储转发</strong>：交换机在转发之前必须接收整个帧，并进行错误校检，如无错误再将这一帧发往目的地址。帧通过交换机的转发时延随帧长度的不同而变化。 </p>
<p><strong>直通式</strong>：交换机只要检查到帧头中所包含的目的地址就立即转发该帧，而无需等待帧全部的被接收，也不进行错误校验。由于以太网帧头的长度总是固定的，因此帧通过交换机的转发时延也保持不变。</p>
<h2 id="9-IP数据报分片"><a href="#9-IP数据报分片" class="headerlink" title="9. IP数据报分片"></a>9. IP数据报分片</h2><h4 id="1）概述-3"><a href="#1）概述-3" class="headerlink" title="1）概述"></a>1）概述</h4><p>将报文分割成多个片段的过程叫做分片。网络中转发的IP报文的长度可以不同，但如果报文长度超过了数据链路所支持的最大长度（MTU），则报文就需要分割成若干个较小的片段才能够在链路上传输。</p>
<h4 id="2）IP数据报分片计算"><a href="#2）IP数据报分片计算" class="headerlink" title="2）IP数据报分片计算"></a>2）IP数据报分片计算</h4><p>例：需要对长度为3820字节的数据报进行分片，MTU为1420。</p>
<p>该数据报的数据部分的长度为 3800 字节（固定首部20字节），因固定首部长度为 20 字节，因此每个数据报片的数据部分长度不能超过 1400 字节。于是分为 3 个数据报片，其数据部分的长度分别为 1400、1400 和 1000 字节。原始数据报首部被复制为各数据报片的首部，但是部分字段需要修改。</p>
<p>在每个数据报片中DF字段都应为0，表示允许分片。最后一个数据报片中MF字段应为0，意为后方无分片。</p>
<p>第一个分片：DF为0 MF为1 片偏移为0/8=0</p>
<p>第二个分片：DF为0 MF为1 片偏移为1400/8=175</p>
<p>第三个分片：DF为0 MF为0 片偏移为2800/8=350</p>
<h2 id="10-CRC冗余校验"><a href="#10-CRC冗余校验" class="headerlink" title="10. CRC冗余校验"></a>10. CRC冗余校验</h2><h4 id="1）概述-4"><a href="#1）概述-4" class="headerlink" title="1）概述"></a>1）概述</h4><p>CRC即循环冗余校验码，是数据通信领域中最常用的一种查错校验码，其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查是一种<strong>数据传输检错功能</strong>，对数据进行多项式计算，<strong>并将得到的结果附在帧的后面</strong>，接收设备也执行类似的算法，以保证数据传输的正确性和完整性。</p>
<h4 id="2）原理"><a href="#2）原理" class="headerlink" title="2）原理"></a>2）原理</h4><p>其根本思想就是先在要发送的帧后面附加一个数（这个就是用来校验的校验码，但要注意，这里的数也是二进制序列的，下同），生成一个新帧发送给接收端。当然，这个附加的数不是随意的，它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除（注意，这里不是直接采用二进制除法，而是采用一种称之为“ <strong>模2除法</strong>”）。到达接收端后，再把接收到的新帧除以（同样采用“ 模2除法”）这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数，做了“去余”处理（也就已经能整除了），所以结果应该是没有余数。<strong>如果有余数，则表明该帧在传输过程中出现了差错。</strong></p>
<h4 id="3）步骤"><a href="#3）步骤" class="headerlink" title="3）步骤"></a>3）步骤</h4><p>CRC校验中有两个关键点，一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串（或多项式），可以随机选择，也可以使用国际标准，但是最高位和最低位必须为1；二是把原始帧与上面计算出的除数进行模2除法运算，计算出CRC码。</p>
<p>①选择合适的除数</p>
<p>②看选定除数的二进制位数，然后再要发送的数据帧上面加上这个位数-1位的0，然后用新生成的帧以模2除法的方式除上面的除数，得到的余数就是该帧的CRC校验码。注意，余数的位数一定只比除数位数少一位，也就是CRC校验码位数比除数位数少一位，如果前面位是0也不能省略。</p>
<p>③将计算出来的CRC校验码附加在原数据帧后面，构建成一个新的数据帧进行发送；最后接收端在以模2除法方式除以前面选择的除数，如果没有余数，则说明数据帧在传输的过程中没有出错。</p>
<h2 id="11-路由：最长匹配原则"><a href="#11-路由：最长匹配原则" class="headerlink" title="11. 路由：最长匹配原则"></a>11. 路由：最长匹配原则</h2><h4 id="1）概述-5"><a href="#1）概述-5" class="headerlink" title="1）概述"></a>1）概述</h4><p>当路由器收到一个IP数据包时，会将数据包的目的IP地址与自己本地路由表中的表项进行bit by bit的逐位查找，直到找到匹配度最长的条目，这叫最长匹配原则。<strong>实际上匹配的是掩码最长的那一条。</strong></p>
<h4 id="2）实际使用"><a href="#2）实际使用" class="headerlink" title="2）实际使用"></a>2）实际使用</h4><p>例：需要到达的IP是172.16.15.3，现在路由表中有这样三条记录：172.16.0.0/16、172.16.15.0/24、172.16.15.0/28</p>
<p>那么实际上该路由在转发时会根据172.16.15.0/28这一条路由信息进行转发，因为他的网段包括需要到达的IP，并且掩码最长，因此匹配度最高。</p>
<p>也就是说需要到达的地址相当于广东省深圳市龙岗区龙翔大道，路由表中这三个地址相当于：广东省、广东省深圳市、 广东省深圳市龙岗区，虽然前两个地址也没错，但是明显匹配度最后一个最高。</p>
<h2 id="12-TCP连接的建立过程"><a href="#12-TCP连接的建立过程" class="headerlink" title="12. TCP连接的建立过程"></a>12. TCP连接的建立过程</h2><h4 id="1）概述-6"><a href="#1）概述-6" class="headerlink" title="1）概述"></a>1）概述</h4><p>TCP的连接过程称为<strong>三次握手</strong>，握手需要在客户和服务器之间<strong>交换三个TCP 报文段</strong>。采用三次握手主要是为了防止已失效的连接请求报文段突然又传送到了，因而产生错误。</p>
<h4 id="2）建立过程"><a href="#2）建立过程" class="headerlink" title="2）建立过程"></a>2）建立过程</h4><p>第一次握手：第 1 次握手建立连接时，客户端向服务器发送 SYN 报文（SEQ=x，SYN=1），并进入 SYN_SENT 状态，等待服务器确认；</p>
<p>第二次握手：第 2 次握手实际上是分两部分来完成的，即 SYN+ACK（请求和确认）报文。服务器收到了客户端的请求，向客户端回复一个确认信息（ACK=x+1）。服务器再向客户端发送一个 SYN 包（SEQ=y）建立连接的请求，此时服务器进入 SYN_RECV 状态；</p>
<p>第三次握手：第 3 次握手，是客户端收到服务器的回复（SYN+ACK 报文）。此时，客户端也要向服务器发送确认包（ACK）。此包发送完毕客户端和服务器进入 ESTABLISHED 状态，完成 3 次握手。<br>完成三次握手，客户端与服务器开始传送数据。</p>
</article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="mailto:undefined">h0ss</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="https://blog.gpnusz.cn/2021/02/02/%E8%AE%A1%E7%BD%91%E8%AF%BE%E7%A8%8B%E5%A4%8D%E4%B9%A0/">https://blog.gpnusz.cn/2021/02/02/%E8%AE%A1%E7%BD%91%E8%AF%BE%E7%A8%8B%E5%A4%8D%E4%B9%A0/</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="https://blog.gpnusz.cn" target="_blank">后端学习记录</a>！</span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/%E8%AE%A1%E7%BD%91/">计网</a></div><div class="post_share"></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/2021/02/02/%E4%BD%8D%E8%BF%90%E7%AE%97%E8%AF%A6%E8%A7%A3/"><img class="prev-cover" src="https://i.loli.net/2021/09/01/KHSB3kcFZDQx4vo.jpg" onerror="onerror=null;src='/img/404.jpg'" alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">位运算详解</div></div></a></div><div class="next-post pull-right"><a href="/2021/02/02/String%E4%B8%89%E5%85%84%E5%BC%9F/"><img class="next-cover" src="https://i.loli.net/2021/09/01/PRTlcsGZMQ7yBqn.jpg" onerror="onerror=null;src='/img/404.jpg'" alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">String三兄弟</div></div></a></div></nav><div class="relatedPosts"><div class="headline"><i class="fas fa-thumbs-up fa-fw"></i><span> 相关推荐</span></div><div class="relatedPosts-list"><div><a href="/2021/02/03/TCP-IP知识点整理/" title="TCP/IP知识点整理"><img class="cover" src="https://i.loli.net/2021/09/01/fdngiWxSpUzqVTD.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2021-02-03</div><div class="title">TCP/IP知识点整理</div></div></a></div></div></div></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="card-info-avatar is-center"><img class="avatar-img" src="/img/avatar.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/><div class="author-info__name">h0ss</div><div class="author-info__description">一个苦逼后端仔的学习记录</div></div><div class="card-info-data"><div class="card-info-data-item is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">51</div></a></div><div class="card-info-data-item is-center"><a href="/tags/"><div class="headline">标签</div><div class="length-num">14</div></a></div></div><a class="button--animated" id="card-info-btn" target="_blank" rel="noopener" href="https://gitee.com/h0ss"><i class="fab fa-github"></i><span>Gitee仓库</span></a></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn card-announcement-animation"></i><span>公告</span></div><div class="announcement_content">Java后端技术栈语雀文档：https://www.yuque.com/oliver-wdtb1/java</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/11/16/%E7%BB%99%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E6%8F%90%E4%BA%86%E4%B8%AAPR/" title="给开源项目提了个PR">给开源项目提了个PR</a><time datetime="2022-11-15T17:28:40.000Z" title="发表于 2022-11-16 01:28:40">2022-11-16</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/09/03/%E3%80%90MySQL%E3%80%91InnoDB%E7%9A%84%E8%A1%8C%E6%A0%BC%E5%BC%8F/" title="【MySQL】InnoDB的行格式">【MySQL】InnoDB的行格式</a><time datetime="2022-09-02T18:17:38.000Z" title="发表于 2022-09-03 02:17:38">2022-09-03</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/08/21/%E3%80%90Debug%E3%80%91bitField-%E5%BC%95%E5%8F%91%E7%9A%84%E6%A0%88%E6%BA%A2%E5%87%BA%E6%8E%92%E9%94%99%E8%AE%B0/" title="【Debug】bitField 引发的栈溢出排错记">【Debug】bitField 引发的栈溢出排错记</a><time datetime="2022-08-20T18:10:40.000Z" title="发表于 2022-08-21 02:10:40">2022-08-21</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/07/16/%E3%80%90RPC%E3%80%91%E8%AF%A6%E8%A7%A3SPI%E6%9C%BA%E5%88%B6/" title="【RPC】详解SPI机制">【RPC】详解SPI机制</a><time datetime="2022-07-15T18:51:57.000Z" title="发表于 2022-07-16 02:51:57">2022-07-16</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/07/14/%E3%80%90Redis%E3%80%91%E9%87%8D%E8%A6%81%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%9F%BA%E7%A1%80/" title="【Redis】重要数据结构基础">【Redis】重要数据结构基础</a><time datetime="2022-07-13T17:22:08.000Z" title="发表于 2022-07-14 01:22:08">2022-07-14</time></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><div class="js-pjax"></div><script defer="defer" id="fluttering_ribbon" mobile="false" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-fluttering-ribbon.min.js"></script><script id="canvas_nest" defer="defer" color="0,0,255" opacity="0.7" zIndex="-1" count="99" mobile="false" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-nest.min.js"></script><script id="click-heart" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/click-heart.min.js" async="async" mobile="false"></script><script id="click-show-text" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/click-show-text.min.js" data-mobile="false" data-text="爱国,敬业,诚信,友善,自由,平等,公正,法治,富强,民主,文明,和谐" data-fontsize="16px" data-random="false" async="async"></script></div></body></html>